﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;

namespace MediSIIM.BizComponent.HangZhouSYKT
{
    public class HangZhouSYKTradeParms
    {
        public bool Succeed { get; set; }
        /// <summary>
        /// 设置入口参数的值
        /// </summary>
        /// <param name="key">参数的名称</param>
        /// <returns></returns>
        public string this[string key]
        {
            get { key = key.ToUpper(); return Items.ContainsKey(key) ? Items[key] : ""; }
            set
            {
                key = key.ToUpper();
                if (Items.ContainsKey(key))
                {
                    Items[key] = value;
                }
                else
                {
                    Items.Add(key, value);
                }
            }
        }

        public string this[int index,string key]
        {
            get { key = key.ToUpper(); return OutItems.ContainsKey(key) ? OutItems[key] : ""; }
            set
            {
                key = key.ToUpper();
                if (Items.ContainsKey(key))
                {
                    OutItems[key] = value;
                }
                else
                {
                    OutItems.Add(key, value);
                }
            }
        }
        /// <summary>
        /// 输入参数集合
        /// </summary>
        public Dictionary<string, string> Items { get; set; }
        public List<string> OutKeys { get; set; }
        /// <summary>
        /// 输出参数集合
        /// </summary>
        public Dictionary<string, string> OutItems { get; set; }
        public DataTable TableView { get; set; }
        /// <summary>
        /// 输入 （长度为6） 参保地行政区划代码，通过读卡获取。
        /// </summary>
        public string AKC803;
        /// <summary>
        /// 输入 （长度为20）定点医疗机构编码。
        /// </summary>
        public string AKB020;
        /// <summary>
        /// 输入 （长度为40） 卡号，通过读卡获取。
        /// </summary>
        public string AKC020;
        /// <summary>
        /// 输入 （长度为6） 交易代码，见接口交易列表。
        /// </summary>
        public string MSGNO;
        /// <summary>
        /// 输入 （长度30） 发送方报文流水号 通过交易1303获取。
        /// </summary>
        public string TradeNo;
        /// <summary>
        /// 输入 （长度6）原交易代码。在冲正、监测交易时，需传入被冲正或者被监测的交易代码。
        /// </summary>
        public string ORGMSGNO;
        /// <summary>
        /// 输入 （长度30） 原发送方报文流水号。在冲正、监测交易时，需传入被冲正或者被监测的发送方报文流水号。
        /// </summary>
        public string ORGMSGID;
        /// <summary>
        /// 输入 （长度10） 操作员编码。
        /// </summary>
        public string OPERID;
        /// <summary>
        ///  输入	（长度30） 业务周期号 通过1501交易获取。
        /// </summary>
        public string YWZQH;
        /// <summary>
        /// 输入 （长度2048） 输入信息。参照交易输入格式信息。格式为XML
        /// </summary>
        public string INPUT;
        /// <summary>
        /// 输入 (长度3)	上传结束标志。长传明细时使用，每次上传按50条为一个批次，超过50条时，分成多个批次上传（每批次上传条数大于1：第一条标识为1,中间记录统一标识为2,最后一条标识为9 ；上传条数等于1：标识为0）。
        /// </summary>
        public string INDICATOR;
        /// <summary>
        /// 输出（长度20） 工作日期。参保地返回的结算工作日期，HIS进行保存，以备日后查账时使用。
        /// </summary>
        public string WORKDATE;
        /// <summary>
        /// 输出(长度30) 。参保地返回的报文ID,HIS方进行保存,以便日后交易使用。
        /// </summary>
        public string REFMSGID;
        /// <summary>
        /// 输出（长度2048） 输出信息 函数调用成功后按交易返回信息的格式提供,格式为XML。(在交易为批量下载时,在OUTPUT中返回下载文件存放位置)
        /// </summary>
        public string OUTPUT;
        /// <summary>
        /// 输出（长度5） 输出信息记录数,针对除批量下载交易以外交易返回的总记录数,特别针对处方明细录入。
        /// </summary>
        public string OUTPUTCOUNT;
        /// <summary>
        /// 输出（长度4） 交易状态 ‘0000’为成功，代码含义见下表。
        /// </summary>
        public string STATUS;
        /// <summary>
        /// 输出 长度(200) 交易返回信息。用于存放交易失败时的信息。
        /// </summary>
        public string RESERVE;

        public HangZhouSYKTradeParms()
        {

        }

        //为空时分配指定空间
        public string isempty(string value, int length)
        {
            if (string.IsNullOrEmpty(value))
            {
                return string.Empty.PadRight(length);
            }
            else
            {
                return value;
            }
        }

        public HangZhouSYKTradeParms(int nTradeType, string tradeNo, string ybyydm, string ywzqh, string caozuoydm, string kaxinxi)
        {
            try
            {
                OutKeys = new List<string>();
                Items = new Dictionary<string, string>();
                OutItems = new Dictionary<string, string>();
                AKC803 = isempty(kaxinxi.Substring(0, 6), 6);
                AKB020 = ybyydm;
                AKC020 = isempty(kaxinxi.Substring(0, 32), 40);
                MSGNO = nTradeType.ToString();
                TradeNo = isempty(tradeNo, 30);
                ORGMSGNO = string.Empty.PadRight(6);
                ORGMSGID = string.Empty.PadRight(30);
                OPERID = caozuoydm;
                YWZQH = isempty(ywzqh, 30);
                INPUT = string.Empty.PadRight(2048);
                INDICATOR = "0";
                WORKDATE = string.Empty.PadRight(20);
                REFMSGID = string.Empty.PadRight(30);
                OUTPUT = string.Empty.PadRight(2048);
                OUTPUTCOUNT = string.Empty.PadRight(5);
                STATUS = string.Empty.PadRight(4);
                RESERVE = string.Empty.PadRight(200);
            }
            catch (Exception)
            {
                throw new Exception("卡信息不符合规则:" + kaxinxi);
            }
        }

        public HangZhouSYKTradeParms(int nTradeType, string tradeNo, string ybyydm, string ywzqh, string caozuoydm)
        {
            OutKeys = new List<string>();
            Items = new Dictionary<string, string>();
            OutItems = new Dictionary<string, string>();
            AKC803 = isempty("", 6);
            AKB020 = ybyydm;
            AKC020 = isempty("", 40);
            MSGNO = nTradeType.ToString();
            TradeNo = isempty(tradeNo, 30);
            ORGMSGNO = string.Empty.PadRight(6);
            ORGMSGID = string.Empty.PadRight(30);
            OPERID = caozuoydm;
            YWZQH = isempty(ywzqh, 30);
            INPUT = string.Empty.PadRight(2048);
            INDICATOR = "0";
            WORKDATE = string.Empty.PadRight(20);
            REFMSGID = string.Empty.PadRight(30);
            OUTPUT = string.Empty.PadRight(2048);
            OUTPUTCOUNT = string.Empty.PadRight(5);
            STATUS = string.Empty.PadRight(4);
            RESERVE = string.Empty.PadRight(200);
        }

        public string GetInputParam()
        {
            string str = "<INPUT>";
            foreach (var item in Items.Keys)
            {
                str += string.Format("<{0}>{1}</{0}>", item, Items[item]);
            }
            return str + "</INPUT>";
        }

        public string GetOutputParam()
        {
            string str = "";
            foreach (var item in OutItems)
            {
                str += item.Key + "=" + item.Value + "|";
            }
            return str;
        }
    }
}
